/*
 * @Author: zqx me_zqx@163.com
 * @Date: 2025-03-14 13:58:18
 * @LastEditors: zqx me_zqx@163.com
 * @LastEditTime: 2025-07-09 10:18:42
 * @FilePath: /XMate-h5/src/utils/num.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
export function formatValue(value, fixed, isPercentage = false) {
  if (value === undefined || value === null) {
    return 0;
  }
  if (isNaN(value)) {
    return 0;
  }
  if (typeof value === "string") {
    value = parseFloat(value);
  }
  if (value === 0) {
    return 0;
  }
  if (value > 1.0) {
    return value.toFixed(fixed);
  }
  let result = value;
  // 将 value 乘以 100
  if (isPercentage) {
    result = value * 100.0;
  }
  // 按照 fixed 保留小数位数
  let formattedResult = result.toFixed(2);

  // 去除结尾的0
  formattedResult = formattedResult.replace(/\.?0+$/, "");

  return formattedResult;
}

export function round(x, pos) {
  if (typeof x === "number") {
    return Math.round(x * Math.pow(10, pos)) / Math.pow(10, pos);
  }
  return 0;
}

/**
 * 优化小数方法：如果小数长度<=2直接返回，否则强制保留后两位
 * @param {number|string} value - 要处理的小数值
 * @returns {string} 优化后的小数字符串
 */
export function optimizeDecimal(value) {
  // 处理null、undefined或NaN
  if (value === null || value === undefined || isNaN(value)) {
    return null;
  }

  // 处理字符串类型
  if (typeof value === "string") {
    // 移除首尾空格
    value = value.trim();
    // 尝试转换为数字
    const numValue = parseFloat(value);
    if (isNaN(numValue)) {
      return null;
    }
    value = numValue;
  }

  // 处理非数字类型
  if (typeof value !== "number") {
    return null;
  }

  // 如果是整数，直接返回
  if (Number.isInteger(value)) {
    return value.toString();
  }

  // 转换为字符串并获取小数部分
  const strValue = value.toString();
  const decimalIndex = strValue.indexOf(".");

  if (decimalIndex === -1) {
    // 没有小数部分
    return strValue;
  }

  const decimalPart = strValue.substring(decimalIndex + 1);

  // 如果小数长度<=2，直接返回原值
  if (decimalPart.length <= 2) {
    return strValue;
  }

  // 否则强制保留后两位
  return value.toFixed(2);
}

export async function generateHash(message) {
  const msgBuffer = new TextEncoder().encode(message); // 将字符串转换为Uint8Array
  const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer); // 生成hash
  const hashArray = Array.from(new Uint8Array(hashBuffer)); // 转换为数组
  const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join(""); // 转换为十六进制字符串
  return hashHex;
}
